
// import { ifBase, Tables, ifKeepKeyUnit, ifKeepImageUnit } from './base';
// import * as fs from 'fs';
// import { join } from 'path'
// import { createHash } from 'crypto'

// // 一个data.json 文件负责管理数据详情
// // 一个data目录负责管理buff数据

// class FileKeeper<T> {
//     private _workpath: string;
//     private get _datapath() {
//         return join(this._workpath, 'data');
//     }
//     private get _jsonpath() {
//         return join(this._workpath, 'config.json');
//     }

//     private _config: T[] = [];
//     private load() {
//         try {
//             this._config = JSON.parse(fs.readFileSync(this._jsonpath).toString())
//         }
//         catch (e) {
//             this._config = [];
//         }
//     }

//     private save() {
//         fs.writeFileSync(this._jsonpath, JSON.stringify(this._config, null, 4));
//     }
//     constructor(path: string) {
//         if (!fs.existsSync(join(path, 'data'))) fs.mkdirSync(join(path, 'data'), { recursive: true })
//         this._workpath = path;

//         this.load();
//     }

//     private changeTo(key: string, value: any) {
//         if (value instanceof Buffer) {
//             // 这里是buff的话那么替换掉
//             let md5Hash = createHash('md5').update(value);
//             let fileName = key + 'hex' + md5Hash.digest('hex') + '.dat';
//             if (!fs.existsSync(fileName)) {
//                 fs.writeFileSync(join(this._datapath), value, { flag: "w+" });
//             }
//             value = md5Hash.digest();
//         }

//         return value;
//     }

//     private changeFrom(key: string, value: any) {
//         if (value instanceof Buffer) {
//             // 这里是buff的话那么替换掉
//             try {
//                 value = fs.readFileSync(join(this._datapath, key + 'hex' + value.toString() + '.dat'));
//             }
//             catch (e) {

//             }
//         }

//         return value;
//     }

//     private delFrom(key: string, value: any) {
//         if (value instanceof Buffer) {
//             // 这里是buff的话那么替换掉
//             try {
//                 value = fs.unlinkSync(join(this._datapath, key + 'hex' + value.toString() + '.dat'));
//             }
//             catch (e) {

//             }
//         }

//         return value;
//     }

//     insert(info: any) {
//         for (let key in info) {
//             info[key] = this.changeTo(key, info[key]);
//         }

//         this.save();
//     }

//     update(fkey: string, fvalue: any, info: any) {
//         for (let key in info) {
//             info[key] = this.changeTo(key, info[key]);
//         }

//         for (let i = 0; i < this._config.length; i++) {
//             let info = this._config[i];
//             if (info[fkey] == fvalue) {
//                 info[fkey] = info;
//                 this.save();
//                 return;
//             }
//         }
//         return;
//     }

//     foreach(cb: (value: T) => boolean): T | undefined {
//         for (let i = 0; i < this._config.length; i++) {
//             let info = this._config[i];

//             let newInfo: any = {};
//             for (let skey in info) {
//                 newInfo[skey] = this.changeFrom(skey, info[skey])
//             }
//             if (cb(newInfo)) {
//                 return newInfo;
//             }
//         }

//         return undefined;
//     }

//     find(key: string, value: any) {
//         for (let i = 0; i < this._config.length; i++) {
//             let info = this._config[i];
//             if (info[key] == value) {
//                 let newInfo: any = {};
//                 for (let skey in info) {
//                     newInfo[skey] = this.changeFrom(skey, info[skey])
//                 }

//                 return newInfo;
//             }
//         }

//         return undefined;
//     }

//     del(key: string, value: any) {
//         let change = false;
//         for (let i = 0; i < this._config.length; i++) {
//             let info = this._config[i];
//             if (info[key] == value) {
//                 for (let skey in info) {
//                     this.delFrom(key, info[skey])
//                 }

//                 delete info[key]
//                 change = true;
//             }
//         }
//         if (change) this.save();
//     }
// }

// // 纯粹文件形式
// export class SqliteMode implements ifBase {
//     db_pic!: FileKeeper<{
//         srcmd5: string,
//         name: string,
//         tinymd5: string,
//         time: number,
//         pic: Buffer
//     }>;

//     db_key!: FileKeeper<{
//         mail: string,
//         key: string,
//         count: number,
//         time: number,
//     }>;

//     async init(path: string) {
//         this.db_pic = new FileKeeper(join(path, 'pic'));
//         this.db_key = new FileKeeper(join(path, 'key'));
//         return true;
//     }

//     change(obj: ifKeepKeyUnit, nCount: number) {
//         let opt: SqliteMode
//         obj.count = nCount;
//         return this.db_key.update('key', obj.key, { count: obj.count });
//     }
//     async getPressKey() {
//         let result = this.db_key.foreach(function (value) {
//             if (value.count > 0) return true;
//             return false;
//         })
//         if (!result) throw 'no account';
//         let obj: any = { count: result.count, key: result.key };
//         obj.change = this.change.bind(this, obj)
//         return obj
//     }

//     async getPic(f: any) {
//         let result = await this.db_pic.find();
//         if (result.length == 0) return undefined;
//         return { count: result[0].count, key: result[0].key, save: this.save, removeSelf: this.removeSelf } as any;
//     }

//     save(this: ifKeepImageUnit, key: string, value: any, ...args: any) {
//         let info = {};
//         for (let i = 0; i < arguments.length; i = i + 2) {
//             info[arguments[i]] = arguments[i + 1];
//         }
//         return Sqlit3DB.inst.updateInfo(Tables.tinypic, { srcmd5: this.srcmd5 }, info);
//     }

//     async removeSelf(this: ifKeepImageUnit) {
//         await Sqlit3DB.inst.deleteInfo(Tables.tinypic, { srcmd5: this.srcmd5 });
//         return true;
//     }

//     async inserPic(f: any) {
//         return Sqlit3DB.inst.insertInfo(Tables.tinypic, f);
//     }

//     async freshAllDB() {
//         return true;
//     }
// }
